package sprite;

import java.awt.Image;
import java.awt.Toolkit;
import java.io.Serializable;
import java.util.Vector;

import game.Livello;
import grafica.Myframe;


public class Personaggio extends Sprite implements Serializable{
	int energia;
	boolean armato;
	boolean vivo;
	int offSetX;
	Sprite mappa[][];
	
	boolean corri;
	boolean direzione;
	boolean spara;
	transient Toolkit t;
	
	boolean cado;
	int arrivo;
	
	int mapWidth;
	boolean attivaThread;
	
	public Personaggio( boolean armato, boolean vivo, int energia , int offSetX, int x,int y,int mapWidth,Vector<Image> pp,Sprite[][] mappa){
		super(x,y,pp);
		this.energia = energia;
		this.armato = armato;
		this.vivo = vivo;
		this.mappa = mappa;
		this.offSetX = offSetX;
		this.mapWidth = mapWidth;
		cado = true;
		t= Toolkit.getDefaultToolkit();
		attivaThread = false;

	}
	public Personaggio( boolean armato, boolean vivo, int energia , int offSetX, int x,int y,Vector<Image> pp){
		super(x,y,pp);
		this.energia = energia;
		this.armato = armato;
		this.vivo = vivo;
		this.offSetX = offSetX;
		cado = true;
		t= Toolkit.getDefaultToolkit();
		attivaThread = false;
	}
	//imposta morto al giocatore;
	public void dead(){
		/*try {*/
		if( vivo == true )
			vivo = false;
		/*}
		catch( Exception e ){
			System.out.println("Error il giocatore e già morto");
		}*/
	}
    //stampa le coordinate
	public String toString(){
		return ( "armato:" + armato + " vivo:" +vivo+ " energia: "+ energia +" offSetX: " + offSetX );
	}
	
	public int getTileI(int avanzamento) {
		return (y + avanzamento)/ Livello.TILE_SIZE;
	}
	
	public int getTileJ(int avanzamento) {
		
		if (x < (Myframe.SCREEN_WIDTH/2))
			return (x + avanzamento)/ Livello.TILE_SIZE;
		else
			return (offSetX + (x  - (Myframe.SCREEN_WIDTH/2)) + avanzamento)/ Livello.TILE_SIZE;
	}		
	
	//metodi di controllo collisione con tile
	
	public boolean tileBottomCollision() {
		int newTilei = this.getTileI(this.getHeight());
		int newTiley = this.getTileJ(0);
		int newTiley2 = this.getTileJ(this.getWidth()-3);
		
		if (!(mappa[newTilei][newTiley] instanceof Mattone) && !(mappa[newTilei][newTiley2] instanceof Mattone)) {
			return false;
		}		
		return true;
	}	
	
	public boolean tileUpCollision() {
		
		int newTilei = this.getTileI(-5);
		int newTiley = this.getTileJ(0);
		int newTiley2 = this.getTileJ(this.getWidth()-3);	
		if (mappa[newTilei][newTiley] == null && mappa[newTilei][newTiley2] == null) {
			return false;
		}		
		return true;
	}
	
	public boolean possoAndareAvanti() {
		
		int tilej = this.getTileJ(3 + this.getWidth());
		int tilei = this.getTileI(0);
		int tilei2 = this.getTileI(this.getHeight() - 5);
		
		if (!(mappa[tilei][tilej] instanceof Mattone) && !(mappa[tilei2][tilej] instanceof Mattone )) {
			
			this.setDirezione(false);
			this.setCorri(true);
			return true;

		}
		else
		{
			this.setCorri(false);
			return false;
		}
	}
	public boolean possoAndareIndietro() {
		int tilej = this.getTileJ(-3);
		int tilei = this.getTileI(0);
		int tilei2 = this.getTileI(this.getHeight() - 5);		
		
		if (!(mappa[tilei][tilej] instanceof Mattone) && !(mappa[tilei2][tilej] instanceof Mattone )) {
			//game.players.get(0).moveBack();
			this.setDirezione(true);
			this.setCorri(true);
			return true;
		}
		else
		{
			this.setCorri(false);
			return false;
		}
	}	
	
	public boolean possoSaltare() {
		
		if(this.tileBottomCollision() && !tileUpCollision()) {
			cado = false;
			arrivo = this.getY() - 100;
			return true;
		}
		return false;
	}
	
	public boolean isCorri() {
		return corri;
	}


	public void setCorri(boolean corri) {
		this.corri = corri;
	}


	public boolean isDirezione() {
		return direzione;
	}


	public void setDirezione(boolean direzione) {
		this.direzione = direzione;
	}
	
	public void setMappaElemnt( int x, int y, Sprite s ){
		mappa[x][y]=s;
	}
	
	public int getEnergia() {
		return energia;
	}
	public void setEnergia(int energia) {
		this.energia = energia;
	}
	public boolean isArmato() {
		return armato;
	}
	public void setArmato(boolean armato) {
		this.armato = armato;
	}
	public boolean isVivo() {
		return vivo;
	}
	public void setVivo(boolean vivo) {
		this.vivo = vivo;
	}
	public int getOffSetX() {
		return offSetX;
	}
	public void setOffSetX(int offSetX) {
		this.offSetX = offSetX;
	}
	
	public void setMappa(Sprite[][] mappa) {
		this.mappa = mappa;
	}
	
	public void setMapWidth(int mapwidth) {
		this.mapWidth = mapwidth;
	}
	public boolean isSpara() {
		return spara;
	}
	public void setSpara(boolean spara) {
		this.spara = spara;
	}
	public boolean isAttivaThread() {
		return attivaThread;
	}
	public void setAttivaThread(boolean attivaThread) {
		this.attivaThread = attivaThread;
	}
	public Sprite[][] getMappa() {
		return mappa;
	}
	public boolean isCado() {
		return cado;
	}
	public void setCado(boolean cado) {
		this.cado = cado;
	}
	public int getArrivo() {
		return arrivo;
	}
	public void setArrivo(int arrivo) {
		this.arrivo = arrivo;
	}
	


	
}
